﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ASoft.Msg
{
    public class PhoneMsg
    {
        public byte First { get { return 0xD7; } }

        public byte Second { get { return 1; } }

        public string PhoneNumber
        {
            get
            {
                if (useBytes.Count >= 8)
                {
                    var result = AppUtility.HexTo10(useBytes[2]).ToString();
                    for (byte i = 3; i < 8; i++)
                    {
                        result += AppUtility.HexTo10(useBytes[i]).ToString("00");
                    }
                    return result;
                }
                return "";
            }
        }

        public byte Length { get; private set; }

        public string Msg
        {
            get
            {
                if (!IsOk)
                    return "";
                var msgBytes = useBytes.Skip(10).Take(Length - 6).ToArray();

                for (int i = 0; i < msgBytes.Length / 2; i++)
                {
                    var m = msgBytes[i * 2 + 1];
                    msgBytes[i * 2 + 1] = msgBytes[i * 2];
                    msgBytes[i * 2] = m;
                }
                string msg = UnicodeEncoding.Unicode.GetString(msgBytes);
                return msg;
            }
        }

        public string Time
        {
            get
            {
                if (!IsOk)
                {
                    return "";
                }
                var result = string.Join("", useBytes.Skip(10 + Length - 6).Select(b => AppUtility.HexTo10(b).ToString("00")).ToArray());
                return result;
            }
        }

        public byte[] Bytes { get { return useBytes.ToArray(); } }

        List<byte> useBytes = new List<byte>();

        public bool IsOk
        {
            get
            {
                if (Length == 0)
                    return false;
                return Length == (useBytes.Count - 10);
            }
        }

        public override string ToString()
        {
            return string.Format("Phone:{0},Msg:{1}", PhoneNumber, Msg);
        }

        public void AppendBytes(byte[] bytes)
        {
            bytes.ToList().ForEach(b =>
            {
                if (useBytes.Count == 0)
                {
                    if (b == First)
                    {
                        useBytes.Add(b);
                    }

                    return;

                }

                if (useBytes.Count == 1)
                {
                    if (b == Second)
                    {
                        useBytes.Add(b);
                    }
                    else
                    {
                        useBytes.Clear();
                        if (b == First)
                        {
                            useBytes.Add(b);
                        }
                    }
                    return;

                }

                if (useBytes.Count == 9)
                {
                    useBytes.Add(b);
                    Length = useBytes[9];
                    return;
                }


                if (useBytes.Count < 10 + Length)
                {
                    useBytes.Add(b);
                }

            });
        }
    }
}
